package cl.solidit.geomanagement.web.controller;

import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import org.codehaus.jackson.map.ObjectMapper;
import org.hibernate.Hibernate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import cl.solidit.geomanagement.persistance.PropiedadDAO;
import cl.solidit.geomanagement.persistance.VisitaDAO;
import cl.solidit.geomanagement.persistance.model.Propiedad;
import cl.solidit.geomanagement.persistance.model.Visita;
import cl.solidit.geomanagement.web.controller.comunication.JSONProperty;

@Controller
public class ConsultarPropiedadController {
	private static final Logger logger = LoggerFactory
			.getLogger(ConsultarPropiedadController.class);
	
	@Autowired
	private PropiedadDAO propiedadDAO;
	
	@Autowired
	private VisitaDAO visitaDAO;

	@RequestMapping(value = "/consultar_propiedad", method = RequestMethod.POST)
	public String consultarPropiedad(
			@ModelAttribute("modeloPropiedad") Propiedad propiedad,
			ModelMap modelo) {
		modelo.get(propiedad);

		return "consultar_propiedad";
	}
	@Transactional
	@RequestMapping(value = "/consultar_propiedad/{numeroPropiedad}", method = RequestMethod.GET)
	public ModelAndView acceso(@PathVariable Long numeroPropiedad) {

		Propiedad propiedad = propiedadDAO.consultarPropiedad(numeroPropiedad);
		Map<String, Object> map = new HashMap<String, Object>();
		Hibernate.initialize(propiedad.getTipoPropiedad());//siempre inicializar la variable cuando depende de otra clase
		Hibernate.initialize(propiedad.getComuna());
		Hibernate.initialize(propiedad.getDisponibilidadVisita());
		Hibernate.initialize(propiedad.getPropietario());
		map.put("propiedad", propiedad);
		for(Visita visita:propiedad.getVisitas())
			Hibernate.initialize(visita.getCliente());
		return new ModelAndView("consultar_propiedad", map);

	}
	
	@Transactional
	@RequestMapping(value = "/search_propiedad", method = { RequestMethod.GET,
			RequestMethod.POST }, produces = "application/json; charset=utf-8")
	public @ResponseBody
	String searchPropiedad(@RequestParam Long numeroPropiedad) {

		if (propiedadDAO.consultarPropiedad(numeroPropiedad) != null) {
			return "{\"result\":\"true\"}";
		}
		return "{\"result\":\"false\"}";

	}
	@Transactional
	@RequestMapping(value = "/search_propiedadInexistente", method = {
			RequestMethod.GET, RequestMethod.POST }, produces = "application/json; charset=utf-8")
	public @ResponseBody
	String search_propiedadinexistente(@RequestParam Long numeroPropiedad) {

		if (propiedadDAO.consultarPropiedad(numeroPropiedad) != null) {
			return "{\"result\":\"false\"}";
		} else {

			return "{\"result\":\"true\"}";
		}
	}
	
	@Transactional
	@RequestMapping(value = "/search_property_data", method = {RequestMethod.GET,RequestMethod.POST},produces = "application/json; charset=utf-8")
	public @ResponseBody String searchPersona(@RequestParam(value="numeroPropiedad") Long numeroPropiedad){
		
		Propiedad p= propiedadDAO.consultarPropiedad(numeroPropiedad);
		if(p==null)
			return "{}";
		JSONProperty jsonProperty = new JSONProperty(p);
		StringWriter writer=new StringWriter();
		String result="{}";
		try {
			new ObjectMapper().writeValue(writer, jsonProperty);
			writer.flush();
			result=writer.toString();
			//System.out.println(result.s);
			writer.close();
		} catch(Exception e) {
			logger.error("No se pudo serializar las propiedades",e);
		}
		return result;
	}
}
